"""
This file is part of GSBEdit. For copyright and licensing information, please
see gsbedit.py in the GSBEdit base directory.
"""


import ConfigParser
import copy
import string


class ModuleConfig:
    def __init__(self, config_filename):
        self.config = self.read_config(config_filename)
    
    
    def read_config(self, config_filename):
        config_file = ConfigParser.ConfigParser()
        config_file.read(config_filename)
        
        self.configs = {}
        module_types = config_file.get('module', 'subtypes').split(',')
        
        base_config = self.get_module_config(config_file, 'module', {'required':[], 'optional':[], 'defaults':{}, 'subtypes':[], 'guiname':''})
        self.configs['module'] = base_config
        
        for module_type in module_types:
            self.add_module_config_and_children(config_file, module_type, base_config, self.configs)
        
        self.reverse_table = dict(config_file.items('reverse_lookup'))
        
    
    def get_module_config(self, config_file, module, base_config):
        module_data = {
                        'required':list(base_config['required']),
                        'optional':list(base_config['optional']),
                        'defaults':dict(base_config['defaults']),
                        'subtypes':[],
                        'guiname':''
                      }
        
        if config_file.has_option(module, 'required'):
            for item in config_file.get(module, 'required').split(','):
                if item in module_data['optional']: module_data['optional'].remove(item)
                module_data['required'].append(item)
        
        if config_file.has_option(module, 'optional'):
            for item in config_file.get(module, 'optional').split(','):
                if item in module_data['required']: module_data['required'].remove(item)
                module_data['optional'].append(item)
        
        if config_file.has_option(module, 'remove'):
            for item in config_file.get(module, 'remove').split(','):
                if item in module_data['required']: module_data['required'].remove(item)
                if item in module_data['optional']: module_data['optional'].remove(item)
        
        if config_file.has_option(module, 'subtypes'):
            module_data['subtypes'] = config_file.get(module, 'subtypes').split(',')
        
        if config_file.has_option(module, 'guiname'):
            module_data['guiname'] = config_file.get(module, 'guiname')
        else:
            module_data['guiname'] = string.capwords(module.split('.')[-1].replace('_', ' '))
        
        for item,value in config_file.items(module):
            if item[:len('default_')] == 'default_':
                attribute = item[len('default_'):]
                module_data['defaults'][attribute] = value
        
        return module_data
    
    
    def add_module_config_and_children(self, config_file, module_type, base_config, config_list):
        new_config = self.get_module_config(config_file, module_type, base_config)
        config_list[module_type] = new_config
        if config_file.has_option(module_type, 'subtypes'):
            children = config_file.get(module_type, 'subtypes').split(',')
            for child in children:
                self.add_module_config_and_children(config_file, '%s.%s' % (module_type, child), new_config, config_list)
        
        
    def get_config(self, module_type):
        if module_type in self.configs:
            return self.configs[module_type]
        return {'required':[], 'optional':[], 'defaults':{}, 'subtypes':[], 'guiname':'- Unknown -'}
    
    
    def reverse_lookup(self, classname):
        return self.reverse_table.get(classname.lower(), 'unknown')
